package ar.com.ctrln.view.dashboard.administracion.cliente;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.zkoss.spring.security.SecurityUtil;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zk.ui.util.Composer;
import org.zkoss.zk.ui.util.Template;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Image;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timer;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.administracion.cliente.RegistrarCliente;
import ar.com.ctrln.control.administracion.cliente.RegistrarContacto;
import ar.com.ctrln.control.compras.proveedor.RegistrarProveedor;
import ar.com.ctrln.control.sistema.usuarios.RegistrarUsuario;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.contacto.Contacto;
import ar.com.ctrln.persistence.model.persona.Cargo;
import ar.com.ctrln.persistence.model.persona.Direccion;
import ar.com.ctrln.persistence.model.persona.Provincia;
import ar.com.ctrln.persistence.model.persona.Localidad;
import ar.com.ctrln.persistence.model.persona.Telefono;
import ar.com.ctrln.persistence.model.sistema.cuentas.Autorizacion;
import ar.com.ctrln.persistence.model.sistema.cuentas.Usuario;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@SuppressWarnings("unused")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarContactoSoloController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 9074827884672456756L;

	@WireVariable
	private RegistrarCliente registrarCliente;

	@WireVariable
	private RegistrarUsuario registrarUsuario;

	@WireVariable
	private RegistrarProveedor registrarProveedor;

	@WireVariable
	private RegistrarContacto registrarContacto;

	private Contacto contacto;

	private Direccion direccion;

	private Localidad localidad;

	private Provincia provincia;

	private Telefono telefono;

	private Telefono fax;

	private Telefono celular;

	@Wire
	public Window wRegistrarContacto;

	@Wire
	public Label lClienteSelect;

	@Wire
	private Textbox txtDocumento;

	@Wire
	private Combobox cboxTipoDNI;

	@Wire
	private Image imgOk;

	@Wire
	private Textbox txtNombre;

	@Wire
	private Textbox txtApellido;

	@Wire
	private Combobox cboxSexo;

	@Wire
	private Datebox dbFechaNac;

	@Wire
	private Combobox cboxCargo;

	@Wire
	private Textbox txtTelefono;

	@Wire
	private Textbox txtFax;

	@Wire
	private Textbox txtCelular;

	@Wire
	private Textbox txtEmail;

	@Wire
	private Textbox txtWeb;

	@Wire
	private Textbox txtCalle;

	@Wire
	private Intbox txtNumero;

	@Wire
	private Textbox txtDepto;

	@Wire
	private Intbox txtPiso;

	@Wire
	private Textbox txtCpostal;

	@Wire
	private Combobox cboxProvincia;

	@Wire
	private Combobox cboxLocalidad;

	@Wire
	private Toolbarbutton btnRegistrarContacto;

	@Wire
	private Popup popup;

	private Toolkit toolkit;

	private Dimension scrnsize;

	private Cliente cliente;

	private Usuario usuario;

	@SuppressWarnings("rawtypes")
	private EventQueue eq;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		// TODO Auto-generated method stub
		super.doAfterCompose(comp);

		imgOk.setVisible(false);
		txtDocumento.setConstraint(validacionContacto);

		eq = EventQueues.lookup("interactive", EventQueues.DESKTOP, true);
		eq.subscribe(new EventListener() {
			public void onEvent(Event event) throws Exception {
				cliente = (Cliente) event.getData();
				lClienteSelect.setValue(cliente.getRazonSocial());
			}
		});

		cboxProvincia.setModel(new ListModelList<Provincia>(registrarCliente
				.listaProvincias()));
		cboxCargo.setModel(new ListModelList<Cargo>(registrarContacto
				.listarCargos()));
		toolkit = Toolkit.getDefaultToolkit();
		scrnsize = toolkit.getScreenSize();
		String strHeight = Integer.toString(scrnsize.height / 2 - 150);
		String strWidth = Integer.toString(scrnsize.width / 2 - 50);
		btnRegistrarContacto.setPopup("popupExito, x=" + strWidth + ", y="
				+ strHeight);

		contacto = registrarCliente.getContacto();

	}

	private Constraint validacionContacto = new Constraint() {

		@Override
		public void validate(Component comp, Object value)
				throws WrongValueException {
			String doc = value.toString();
			Contacto resultado = registrarContacto.buscarContactoDoc(doc);
			if (resultado == null) {
				imgOk.setVisible(true);
			} else {
				imgOk.setVisible(false);
				throw new WrongValueException(comp, "Contacto ya Existe!");
			}
		}
	};

	@Listen("onClick = #btnRegistrarContacto")
	public void registrarContacto() {
		if (contacto != null) {
			contacto.setTipoDni(cboxTipoDNI.getSelectedItem().getLabel());
			contacto.setDocumento(txtDocumento.getValue());
			contacto.setApellido(txtApellido.getValue());
			contacto.setNombre(txtNombre.getValue());

			direccion = registrarContacto.getDireccion();

			direccion.setCalle(txtCalle.getValue());
			
			if (txtNumero.getValue() == null)
				direccion.setNumero("");
			else
				direccion.setNumero(Integer.toString(txtNumero.getValue()));

			direccion.setCodigoPostal(txtCpostal.getValue());
			
			if (txtDepto.getText() == "") {
				direccion.setDepartamento("");
			} else {
				direccion.setDepartamento(txtDepto.getValue());
			}
		
			if (txtPiso.getValue() == null) {
				direccion.setPiso("0");
			} else {
				direccion.setPiso(Integer.toString(txtPiso.getValue()));
			}

			direccion.setTipoDireccion(Direccion.TIPO_DIRECCION_FISCAL);

			localidad = (Localidad) cboxLocalidad.getModel().getElementAt(
					cboxLocalidad.getSelectedIndex());

			Set<Direccion> direcciones = new HashSet<Direccion>();

			direccion.setLocalidad(localidad);

			direcciones.add(direccion);

			contacto.setDirecciones(direcciones);

			telefono = registrarContacto.getTelefono();

			fax = registrarContacto.getTelefono();

			celular = registrarContacto.getTelefono();

			contacto.setCargo((Cargo) cboxCargo.getModel().getElementAt(
					cboxCargo.getSelectedIndex()));

			telefono.setTipoTelefono(Telefono.TIPO_TELEFONO_OFICINA);
			fax.setTipoTelefono(Telefono.TIPO_TELEFONO_FAX);
			celular.setTipoTelefono(Telefono.TIPO_TELEFONO_PERSONAL);

			telefono.setNumero(txtTelefono.getValue());
			fax.setNumero(txtFax.getValue());
			celular.setNumero(txtCelular.getValue());

			Set<Telefono> telefonos = new HashSet<Telefono>();

			telefonos.add(telefono);
			telefonos.add(fax);
			telefonos.add(celular);

			contacto.setFechaNacimiento(dbFechaNac.getValue());

			contacto.setTelefonos(telefonos);

			contacto.setOrganizacion(cliente);

			usuario = new Usuario();
			String u = contacto.getNombre().substring(0, 1).toLowerCase()
					+ contacto.getApellido().toLowerCase();

			usuario.setNombre(u);
			usuario.setPassword(u);
			usuario.setBloqueada(true);
			usuario.setActivada(true);
			usuario.setExpirada(true);
			usuario.setCredencialExpirada(true);

			usuario.setAuthorities(setAutorizaciones());

			registrarUsuario.nuevo(usuario);

			contacto.setUsuario(usuario);

			registrarContacto.guardarContacto(contacto);

			popup.close();

			Clients.showNotification("El Contacto " + txtNombre.getValue()
					+ " " + txtApellido.getValue() + " se registro con exito!",
					Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);
		} else {
			Clients.showNotification(
					"Error Nro. 501"
							+ "/n"
							+ " al registrar Contacto, pongase en contacto con Sistemas",
					Clients.NOTIFICATION_TYPE_ERROR, null, "middle_center",
					2500);
		}

		wRegistrarContacto.onClose();

	}

	@Listen("onSelect = #cboxProvincia")
	public void seleccionLocalidad() {
		provincia = (Provincia) cboxProvincia.getModel().getElementAt(
				cboxProvincia.getSelectedIndex());
		cboxLocalidad.setModel(new ListModelList<Localidad>(registrarCliente
				.listaLocalidadPorProvincia(provincia.getId())));
	}

	public void cleanComponent() {

		Collection<Component> components = wRegistrarContacto.getFellows();
		for (Component component : components) {
			System.out.println(component.getId());
			if (component instanceof Textbox) {
				((Textbox) component).setValue("");
			}
		}

	}

	@Listen("onClick = #btnSelectEmisor")
	public void selectEmisor() {
		Executions.createComponents("/zul/reusables/seleccionarCliente.zul",
				null, null);
	}

	public Set<Autorizacion> setAutorizaciones() {
		Set<Autorizacion> autorizaciones = new HashSet<Autorizacion>();
		Autorizacion u = registrarUsuario.buscar("ROLE_USER");
		autorizaciones.add(u);

		Cargo cargo = cboxCargo.getSelectedItem().getValue();
		switch ((int) cargo.getId()) {

		case 1:
			autorizaciones.add(registrarUsuario
					.buscar("ROLE_COOPERATIVA_PRESIDENTE"));
			break;
		case 2:
			autorizaciones.add(registrarUsuario
					.buscar("ROLE_COOPERATIVA_COORDINADOR"));
			break;
		case 3:
			autorizaciones.add(registrarUsuario
					.buscar("ROLE_COOPERATIVA_TECNICO"));
			break;
		case 4:
			autorizaciones.add(registrarUsuario
					.buscar("ROLE_COOPERATIVA_ADMINISTRACION"));
			break;

		default:
			break;
		}
		return autorizaciones;
	}

}
